package com.zbcn.common.base.generic;

/**
 * 泛型方法测试
 * 泛型类，是在实例化类的时候指明泛型的具体类型；泛型方法，是在调用方法的时候指明泛型的具体类型
 *
 * @author Administrator
 * @date 2019/1/15 15:32
 */
public class GenericMethod {

    /**
     * 泛型方法的基本介绍
     * @param clazz 传入的泛型实参
     * @return T 返回值为T类型
     * 说明：
     *     1）public 与 返回值中间<T>非常重要，可以理解为声明此方法为泛型方法。
     *     2）只有声明了<T>的方法才是泛型方法，泛型类中的使用了泛型的成员方法并不是泛型方法。
     *     3）<T>表明该方法将使用泛型类型T，此时才可以在方法中使用泛型类型T。
     *     4）与泛型类的定义一样，此处T可以随便写为任意标识，常见的如T、E、K、V等形式的参数常用于表示泛型。
     */
    public static <T> T genericMethod(Class<T> clazz) throws InstantiationException,IllegalAccessException{
        T instance = clazz.newInstance();
        return instance;
    }

    public static void main(String[] args) {
        Class<FruitGenerator> aClass = null;
        try {
            aClass = (Class<FruitGenerator>) Class.forName("com.zbcn.demo.base.generic.FruitGenerator");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try {
            genericMethod(aClass);
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}
